package com.qvtu.poetry.service;

import com.qvtu.poetry.entry.Poem;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qvtu.poetry.entry.dto.*;

/**
 * @author zxz
 * @description 针对表【t_poem(诗歌表)】的数据库操作Service
 * @createDate 2025-10-11 10:42:09
 */
public interface PoemService extends IService<Poem> {

    /**
     * 按条件分页搜索诗歌（封装查询、排序、分页的所有逻辑）。
     */
    Page<Poem> searchPage(PoemSearchDTO dto);

    /**
     * 获取已发布的诗歌详情（未发布或不存在返回 null）。
     */
    Poem getPublishedById(Long id);

    /**
     * 获取已发布诗歌的简单分页列表（按更新时间倒序）。
     */
    Page<Poem> listPublishedPage(Integer pageNum, Integer pageSize);

    /**
     * 根据用户ID分页查询该用户创作的诗歌列表。
     * 可选按状态过滤：0-草稿，1-已发布；若为空则排除已删除(2)。
     */
    Page<Poem> listUserPage(Long userId, Integer pageNum, Integer pageSize, Integer status);

    /**
     * 根据请求条件生成诗歌正文（不持久化）。
     */
    String generatePoem(PoemCreateDTO req);

    /**
     * 生成并解析为结构化结果：标题、正文。
     */
    PoemGenerateResp generatePoemStructured(PoemCreateDTO req);

    /**
     * 新增诗歌
     *
     * @param userId     用户ID
     * @param poemAddDTO 诗歌信息
     * @return 是否成功
     */
    boolean addPoem(Long userId, PoemAddDTO poemAddDTO);

    /**
     * 统计用户诗歌数量
     *
     * @param userId 用户ID
     * @return 诗歌数量
     */
    int countUserPoems(Long userId);

    /**
     * 获取已发布诗歌的分页列表，并包含用户操作状态和点赞总数
     *
     * @param pageNum  页码
     * @param pageSize 每页大小
     * @param userId   用户ID（可选，为null时不查询用户操作状态）
     * @return 分页结果
     */
    Page<PoemWithUserActionDTO> listPublishedPageWithUserAction(Integer pageNum, Integer pageSize, Long userId);

    /**
     * 按条件分页搜索诗歌，并包含用户操作状态和点赞总数
     *
     * @param dto    搜索条件
     * @param userId 用户ID（可选，为null时不查询用户操作状态）
     * @return 分页结果
     */
    Page<PoemWithUserActionDTO> searchPageWithUserAction(PoemListDTO dto);

}
